package hui.com.JWT;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtTokenProvider {

    // 请替换为你的密钥
    private static final String SECRET_KEY = "yourSecretKey";

    // 有效期，单位毫秒
    private static final long EXPIRATION_TIME = 1000*60*60*24; // 一天
    private static final long EXPIRATION_TIME2 = 1000*60*60*24*15; // 15天

    /**
     * JWT加密
     * @param username 你要加密的，变量
     * @param isLoongTerm 是否长期登录
     * @return 返回加密后的令牌
     */
    public static String generateToken(String username,boolean isLoongTerm) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + (isLoongTerm ? EXPIRATION_TIME:EXPIRATION_TIME2));// 设置令牌有效
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now) // 设置令牌有效期
                .setExpiration(expirationDate)// 设置令牌有效期
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }


    /**
     * 判断令牌是否在有效期内
     * @param token 钥匙
     * @return true/false
     */
    public static boolean validateToken(String token) {
        try {
            Jws<Claims> claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token);

            // 如果没有抛出异常，表示令牌是有效的
            return true;
        } catch (Exception e) {
            // 处理异常，表示令牌无效
            return false;
        }
    }

    /**
     * JWT加密
     * @param username 你要加密的，变量
     * @param key 密钥，加密变量（用于解锁和加密）
     * @return 返回加密后的令牌
     */
    public static String generateToken2(String username,String key) {
        Date now = new Date();
        return Jwts.builder()
                .setSubject(username)
//                .setIssuedAt(now) // 设置令牌有效期
//                .setExpiration(expirationDate)// 设置令牌有效期
                .signWith(SignatureAlgorithm.HS512, key)
                .compact();
    }


    /**
     * 判断令牌是否在有效期内(如果没有设置时间则，则只要满足解锁条件就可)
     * @param token 加密令牌
     * @param key 加密钥匙，用于解锁令牌
     * @return true/false
     */
    public static boolean validateToken2(String token,String key) {
        try {
            Jws<Claims> claims = Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(token);

            // 如果没有抛出异常，表示令牌是有效的
            return true;
        } catch (Exception e) {
            // 处理异常，表示令牌无效
            return false;
        }
    }
}

